/*
 * Copyright (C) 2006-2007 Eskil Bylund
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

using System;

using Gtk;
using Mono.Unix;

using DCSharp.Backend.Connections;
using DCSharp.Backend.Objects;

namespace DCSharp.Gui
{
	public class UserView : MenuTreeView
	{
		private ActionGroup actionGroup;

		#region Constructors

		public UserView(TreeModel model) : base(model)
		{
			RulesHint = true;

			// User interface
			ActionEntry[] entries = new ActionEntry[] {
				new ActionEntry("PrivateMessage", null, Catalog.GetString("_Private Message"), null,
					Catalog.GetString("Send a private message."),
					OnPrivateMessage),
				new ActionEntry("FileList", Stock.Directory, Catalog.GetString("_Browse Files"), null,
					Catalog.GetString("Browse the users files"),
					OnFileList),
				new ActionEntry("Information", Stock.Info, Catalog.GetString("_Information"), null,
					Catalog.GetString("View user information"),
					OnUserInfo)
			};

			actionGroup = new ActionGroup("UserViewActions");
			actionGroup.Add(entries);

			// Columns
			TreeViewColumn column;
			CellRendererText textRenderer;
			CellRendererPixbuf pixbufRenderer;

			// User
			column = new TreeViewColumn();
			column.Title = Catalog.GetString("User");
			column.SortColumnId = (int)UserStore.Column.Nick;
			column.Expand = true;
			column.Resizable = true;
			column.Spacing = 3;
			AppendColumn(column);

			pixbufRenderer = new CellRendererPixbuf();
			column.PackStart(pixbufRenderer , false);
			column.SetCellDataFunc(pixbufRenderer, RenderUserPixbuf);

			textRenderer = new CellRendererText();
			textRenderer.Ellipsize = Pango.EllipsizeMode.End;
			column.PackStart(textRenderer , true);
			column.AddAttribute(textRenderer, "text", (int)UserStore.Column.Nick);

			// Shared
			textRenderer = new CellRendererText();
			column = AppendColumn(Catalog.GetString("Shared"), textRenderer,
				new TreeCellDataFunc(RenderUserShare));
			column.SortColumnId = (int)UserStore.Column.ShareSize;
			column.Expand = true;
			column.Resizable = true;

			// Set fixed height mode
			foreach (TreeViewColumn treeColumn in Columns)
			{
				treeColumn.Sizing = TreeViewColumnSizing.Fixed;
			}
			FixedHeightMode = true;
		}

		#endregion

		#region Properties

		public Identity SelectedUser
		{
			get
			{
				TreeIter iter;
				if (Selection.GetSelected(out iter))
				{
					return Model.GetValue(iter, (int)UserStore.Column.User)
						as Identity;
				}
				return null;
			}
		}

		#endregion

		#region Methods

		protected override bool OnButtonPressEvent(Gdk.EventButton evnt)
		{
			if (evnt.Type == Gdk.EventType.TwoButtonPress)
			{
				TreePath path;
				TreeIter iter;

				if (GetPathAtPos((int)evnt.X, (int)evnt.Y, out path) &&
					Model.GetIter(out iter, path))
				{
					Identity identity = (Identity)Model.GetValue(iter,
						(int)UserStore.Column.User);
					HubConnection hub = (HubConnection)Model.GetValue(iter,
						(int)UserStore.Column.Hub);

					if (hub != null)
					{
						Globals.Gui.ShowChat(hub.LocalIdentity.User, identity.User, true);
						return true;
					}
				}
			}
			return base.OnButtonPressEvent(evnt);
		}

		protected override void OnPopulatePopup(Menu menu)
		{
			Action fileListAction = actionGroup["FileList"];
			Action messageAction = actionGroup["PrivateMessage"];
			Action infoAction = actionGroup["Information"];

			TreeIter iter;
			if (Selection.GetSelected(out iter))
			{
				HubConnection hub = Model.GetValue(iter,
					(int)UserStore.Column.Hub) as HubConnection;

				fileListAction.Sensitive = hub != null;
			}

			// Populate the menu
			menu.Add(messageAction.CreateMenuItem());
			menu.Add(fileListAction.CreateMenuItem());

			MenuItem item = new SeparatorMenuItem();
			menu.Add(item);
			item.Show();

			menu.Add(infoAction.CreateMenuItem());

			base.OnPopulatePopup(menu);
		}

		private void OnPrivateMessage(object obj, EventArgs args)
		{
			TreeIter iter;
			if (Selection.GetSelected(out iter))
			{
				Identity identity = (Identity)Model.GetValue(iter,
					(int)UserStore.Column.User);
				HubConnection hub = (HubConnection)Model.GetValue(iter,
					(int)UserStore.Column.Hub);

				if (hub != null)
				{
					Globals.Gui.ShowChat(hub.LocalIdentity.User, identity.User, true);
				}
			}
		}

		private void OnFileList(object obj, EventArgs args)
		{
			Util.RequestFileList(SelectedUser.User);
		}

		private void OnUserInfo(object obj, EventArgs args)
		{
			Globals.Gui.ShowUserInformation(SelectedUser.User);
		}

		private void RenderUserPixbuf(TreeViewColumn column,
			CellRenderer renderer, TreeModel model, TreeIter iter)
		{
			Identity identity = (Identity)model.GetValue(iter,
				(int)UserStore.Column.User);

			((CellRendererPixbuf)renderer).Pixbuf = Util.GetUserIcon(identity);
		}

		private void RenderUserShare(TreeViewColumn column,
			CellRenderer renderer, TreeModel model, TreeIter iter)
		{
			Identity identity = (Identity)model.GetValue(iter,
				(int)UserStore.Column.User);

			((CellRendererText)renderer).Text = Util.FormatFileSize(identity.ShareSize);
		}

		#endregion
	}
}
